iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
AI & Data

從零開始的套牢生活 - AI股票預測系統系列 第 15

[Day 15] backtesting 使用說明

  • 分享至 

  • xImage
  •  

策略(Strategy)

自定義策略

class SmaCrossCons(ConsStrategy):
    # Class variable for parameters tuning
    fast_days = 5
    slow_days = 15

    def init(self):
        super().init()

        self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
        self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
        self.conservative = True

    def next(self):
        if crossover(self.fast_line, self.slow_line):
            if len(self.trades) > 0:
                self.trades[0].close()

            self.buy()
        elif crossover(self.slow_line, self.fast_line):
            if len(self.trades) > 0:
                self.trades[0].close()

            if self.conservative == False:
                self.sell()

基底類別

super().init():繼承Strategy的初始化函式。
params(self):用來記錄訓練後參數。

class ConsStrategy(Strategy):
    def init(self):
        super().init()
        self.conservative = True

    @property
    def params(self):
        return self._params

調參

參數可藉由backtesting.optimize()進行參數優化。

# Class variable for parameters tuning
fast_days = 5
slow_days = 15

初始化

def init(self):
    super().init()

    self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
    self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
    self.conservative = True

進退場時機

def next(self):
    if crossover(self.fast_line, self.slow_line):
        if len(self.trades) > 0:
            self.trades[0].close()

        self.buy()
    elif crossover(self.slow_line, self.fast_line):
        if len(self.trades) > 0:
            self.trades[0].close()

        if self.conservative == False:
            self.sell()

該語法會將之前的操作清空,作用等同於exclusive_orders=True

if len(self.trades) > 0:
    self.trades[0].close()

策略為激進時self.conservative = False,允許賣空。

if self.conservative == False:
    self.sell()

回測

test = Backtest(
    data=df,
    strategy=SmaCrossCons,
    cash=10000000,
    commission=0.004,
    exclusive_orders=True,
    hedging = True,
    trade_on_close=True,
)
  • data:股票資料,格式參考:
    https://ithelp.ithome.com.tw/upload/images/20210920/20141586fvgZOW1Flp.png
  • strategy:回測策略。
  • cash:本金。
  • commission:交易手續費。
  • hedging:若為True時,優先對之前操作進行抵銷。
    • Sell(1100)Buy(1000) -> 賣空100
    • Sell(1000)Buy(1100) -> 買空100
    • Sell(1000)Sell(1100) -> 賣空2100
  • exclusive_orders:若為True時,每次操作前自動關閉(close)上次操作。
    • Buy(500)Buy(1000) -> 最後持股1000
    • Buy(500)Sell(500) -> 賣空500
  • trade_on_close:於收盤時交易,否則預設於開盤交易。

調參

對參數進行優化,尋找該策略下的最佳參數,
參數必須為Strategy的Class variable。

constraint:限定組合必須符合特定條件

result = test.optimize(
    fast_days=[5,10,15],
    slow_days=[10,15,20],
    constraint=lambda p: p.fast_days < p.slow_days,
)

最後的測試組合為:(5,10), (5,15), (5,20), (10,15), (10,20), (15,20)。

尾聲

backtesting你的文檔可以寫得再爛點沒關係。


上一篇
[Day 14] 回測分析
下一篇
[Day 16] 保守型投資 - 「只買不賣」策略真的賺?
系列文
從零開始的套牢生活 - AI股票預測系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言